package offer2

/*
*
https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/submissions/

剑指 Offer 56 - II. 数组中数字出现的次数 II
在一个数组 nums 中除一个数字只出现一次之外，其他数字都出现了三次。请找出那个只出现一次的数字

示例 1：
输入：nums = [3,4,3,3]
输出：4

示例 2:
输入：nums = [9,1,7,9,7,9,7]
输出：1

思路:
统计要找的这个数x, 它二进制位中, 每个位是0还是1
5 5 5 3

5的二进制位	0 1 0 1

	0 1 0 1
	0 1 0 1

3的二进制位	0 0 1 1

先求个位上1的个数, 是4个, 然后进行对3取余, 等于1, 那么意味着结果的二进制位上为1
依次类推, 可以求出结果的每个位置上0或1的情况, 翻译为10进制, 即可确定结果
*/
func training(nums []int) int {
	res := make([]int, 64) //声明64位数组

	bit := 1 //比特位
	sum := 0 //总和

	for i := 0; i < 64; i++ { //遍历每一位的累加情况
		for j := 0; j < len(nums); j++ { //遍历每个数组元素
			if (nums[j] & bit) != 0 { //当前元素的 当前位, 不是0
				res[i]++ //位记录数组,对应位置+1
			}
		}

		res[i] = res[i] % 3    //位记录数组每个位置都需要%3, 剩下唯一出现一次的数字的二进制数对应位
		sum = sum + res[i]*bit // res38[i]: 要么是1,要么是0  bit:1不断左移的计数,变化也一直是2的倍数
		bit = bit << 1
	}

	return sum
}
